/**
  ******************************************************************************
  * @file    dev_common_type.h
  * @author  Yun
  * @version V1.2.0
  * @date    2025-02-12
  * @brief   设备驱动框架通用类型定义
  * @license EULA (End User License Agreement)
  *          Copyright (c) 2025 星瑜科技自动化 Co., Ltd. All rights reserved.
  ******************************************************************************
  */

#ifndef FRAMEWORK_DEV_COMMON_TYPE_H
#define FRAMEWORK_DEV_COMMON_TYPE_H

#ifdef __cplusplus
extern "C" {
#endif

/*---------------------- Includes ----------------------*/
#include <stdint.h>    // 标准整型类型定义
#include <string.h>    // 字符串操作函数
#include "event.h"     // 事件处理函数

/*---------------------- 宏定义 ----------------------*/

#define DEV_LOCK(pDev) \
do {                   \
    pDev->u8RunState = DEV_BUSY; \
} while(0)

#define DEV_UNLOCK(pDev) \
do { \
    pDev->u8RunState = DEV_IDLE; \
    pDev->u8LockState = DEV_UNLOCK; \
} while(0)


#define DEV_BUSY(pDev) \
do {                   \
    if(pDev->u8LockState == DEV_LOCK) \
        DEV_LOCK(pDev); \
} while(0)


#define DEV_UN_INIT(pDev) \
do {                   \
    pDev->u8InitState = DEV_NOT_INIT; \
} while(0)


#define DEV_INIT(pDev) \
do {                   \
    pDev->u8InitState = DEV_IS_INIT; \
    pDev->u8RunState = DEV_IDLE; \
    pDev->u8LockState = DEV_UNLOCK; \
} while(0)

#define CHECK_DEV_ENABLE(pDev) \
do {                   \
    if(pDev->u8InitState != DEV_IS_INIT || pDev->u8RunState!= DEV_IDLE) \
        return DEV_ERROR; \
} while(0)


/**
  * @brief  设备操作状态快速检查宏
  * @param  func: 待检查的设备操作函数
  * @retval 无
  * @note   当操作状态不等于DEV_OK时，立即返回DEV_ERROR
  * @usage  CHECK_DEV_STATUS(Device_Init());
  */
#define CHECK_DEV_STATUS(func) do { \
    if ((func) != DEV_OK) {         \
        return DEV_ERROR;           \
    }                               \
} while(0)



/*!< 设备事件推送最大重试次数 */
#define DEV_PUSH_EVENT_MAX_RETRY_COUNT 10U

/**
  * @brief  设备事件推送宏
  * @param  event: 待推送的设备事件
  * @param  pDev:  事件关联的设备对象
  * @param  pArgs: 事件参数
  * @retval 无
  * @note   用于向事件队列推送设备事件，若推送失败则重试
  * @usage  DEV_PUSH_EVENT(EVENT_DEV_INIT, pDev, NULL);
  */
#define DEV_PUSH_EVENT(event,pDev,pArgs)                \
do{                                                     \
    uint8_t u8Retry = 0;                                \
    do{                                                 \
        if(Event_Queue_Push(event,                      \
                pDev,                                   \
                pArgs)) break;                          \
        u8Retry++;                                      \
    } while (u8Retry < DEV_PUSH_EVENT_MAX_RETRY_COUNT); \
}while(0)                                               \

/*---------------------- 类型定义 ----------------------*/
///**
//  * @brief  设备事件回调函数指针类型
//  * @param  void
//  * @retval void
//  * @note   用于注册设备状态变化时的回调函数
//  *         典型应用场景：中断服务例程中触发事件
//  */
//typedef void (*pEventCallback)(void);

/**
  * @brief  设备电平状态枚举
  */
typedef enum {
    LOW_LEVEL = 0U,    /*!< 低电平状态，对应0V */
    HIGH_LEVEL         /*!< 高电平状态，典型值3.3V/5V */
} DEV_Level_TypeDef;

/**
  * @brief  设备操作状态枚举
  */
enum Dev_Result_State{
    DEV_ERROR = 0U,           /*!< 操作失败，发生未定义错误 */
    DEV_OK,                   /*!< 操作成功完成 */
};

enum Dev_Run_State {
    DEV_BUSY = 0U,                 /*!< 设备忙状态（正在处理前序操作） */
    DEV_IDLE,                 /*!< 设备空闲可操作状态 */
};

enum Dev_Init_State {
    DEV_NOT_INIT = 0U,             /*!< 设备未初始化 */
    DEV_IS_INIT,              /*!< 设备已初始化 */
};

enum Dev_Lock_State {
    DEV_LOCK = 0U,                 /*!< 设备忙状态（正在处理前序操作） */
    DEV_UNLOCK,                 /*!< 设备空闲可操作状态 */
};

#ifdef __cplusplus
}
#endif

#endif /* FRAMEWORK_DEV_COMMON_TYPE_H */

/************************ (C) COPYRIGHT 星瑜科技自动化 *****END OF FILE****/
